package servicios

import aerolinea.OrdenBusqueda
import aerolinea.Vuelo
import daos.BusquedaDAO
import daos.Operation
import daos.SessionManager
import java.util.List

class Busqueda {
    
	@Property Criterio criterio
	
	def buscarPor(Criterio crite, OrdenBusqueda unOrden){
		SessionManager.runInSession(new BuscarPor(crite, unOrden))
	}
	
	def guardarCriterio(Criterio crite){
		SessionManager.runInSession(new GuardarCriterio(crite))		
	}
	
	def consultarCriterio(int id){
		SessionManager.runInSession(new ConsultarCriterio(id))
	}
}

class ConsultarCriterio implements Operation<Criterio>{
	
	@Property int idCriterio
	
	new(int id){
		idCriterio= id
	}
	
	override execute(){
		var c= new BusquedaDAO().get(idCriterio)
		c
	}
	
}

class BuscarPor implements Operation<List<Vuelo>>{
	
	@Property Criterio criterio
	@Property OrdenBusqueda unOrden
	
	new(Criterio crite, OrdenBusqueda ord){
		criterio= crite
		unOrden= ord
	}
	
	override execute() {
		var vuelos= new BusquedaDAO().get(criterio, unOrden)
		vuelos
	}
	
}

class GuardarCriterio implements Operation<Criterio>{
	
	@Property Criterio criterio
	
	new(Criterio crite){
		criterio= crite
	}
	
	override execute() {
		new BusquedaDAO().save(criterio)
		criterio
	}
	
}

abstract class Criterio {
	@Property int id
	new(){}
	def String getQuery()
}

class CriterioSimple extends Criterio {
	
	@Property String propiedad
	@Property String operacion
	@Property String valor
	new(){}
	new(String prop,String oper,String valo){
		propiedad= prop
		operacion= oper
		valor= valo
	}
	
	override getQuery() {
		propiedad +" "+ operacion +" "+ valor
	}
	
}

class CriterioCompuesto extends Criterio {
	@Property Criterio criterio1
	@Property Criterio criterio2
	@Property String operadorLogico
	new(){}
	new(Criterio cri1, Criterio cri2, String ope){
		criterio1= cri1
		criterio2= cri2
		operadorLogico= ope
	}
	
	override getQuery() {
		criterio1.getQuery +" "+ operadorLogico +" "+ criterio2.getQuery
	}
	
}